#include <my_header.h>
// 获取当前时间的毫秒值
long long current_time_mills(void)
{
    // stat系统调用函数中stat结构体内的struct timespec st_mtim
    // 文件的最后修改时间的结构体对象
    // 成员包括 tv_sec tv_nsec
    struct timespec ts;
    // int clock_gettime(clockid_t clock_id, struct timespec *tp);
    clock_gettime(CLOCK_REALTIME, &ts); // 获取当前时间
    return (long long)ts.tv_sec * 1000000000LL + ts.tv_nsec;
    // 转换为毫秒
}

void cp_file(const char *src, const char *dest)
{
    // 使用系统调用函数open打开源文件
    int src_fd = open(src, O_RDONLY);
    ERROR_CHECK(src_fd, -1, "open read");

    // 使用系统调用函数open打开目标文件
    int dst_fd = open(dest, O_RDWR | O_CREAT | O_TRUNC, 0666);
    ERROR_CHECK(dst_fd, -1, "open write");

    char buf[1024]; // 文件缓冲区
    ssize_t bytes_read,bytes_written;

    while((bytes_read = read(src_fd, buf, sizeof(buf))) > 0)
    {
        bytes_written = write(dst_fd, buf, bytes_read);
        if(bytes_read != bytes_written)
        {
            perror("写入目标文件失败");
            close(src_fd);
            close(dst_fd);
            exit(EXIT_FAILURE);
        }
    }// while循环结束时写入目标文件已经成功
     // 最终等于0表示已读取到文件末尾
     // 负数会在后续代码中处理错误
     
     //如果小于 0，说明在读取源文件时发生了错误。
    if(bytes_read < 0)
    {
        perror("读取源文件失败");
    }
    close(src_fd);
    close(dst_fd);

}

/* Usage:  ./3_cp_time source_file dest_file*/
int main(int argc, char *argv[]){                                  
    ARGS_CHECK(argc, 3);

    const char *src = argv[1];
    const char *dest = argv[2];

    long long start_time = current_time_mills();  //记录开始时间
    cp_file(src, dest); // 执行文件复制操作
    long long end_time = current_time_mills();  // 记录结束时间
    
    // 输出复制所需时间
    printf("文件复制时间: %lld 毫秒\n", end_time - start_time);
   
    return 0;
}


